<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
    <style>
        .one,.two,.three,.four{
            border: 1px solid #333;
            padding: 5px;
            margin: 5px;
        }
    </style>
</head>
<body>
    <div id="app">
        <com-a></com-a>
    </div>
</body>
<script>
  
    var comD = {
        // inject选项是一个数组 =>  对应属性名接收父组件注入的数据
        // 组件d["a"] = 父组件["a"]
        // inject:["a","b"],
        
        
        // inject选项是一个对象 =>  自定义属性名接收父组件注入某个数据
        // 组件d["A"] = 父组件["a"]
        // inject:{
        //     A:"a",  // 在当前实例中自定义属性A 接收父组件传入的属性a
        //     B:"b",
        // },

        inject:{
            A:{
                from:"a",  // 在当前实例中自定义属性A 接收父组件传入的属性a
                default:10,
            },  
            B:"b",
            C:{
                from:"c",
                default:3,
            }
        },

        data(){
            return {
               
            }
        },
        template:`<div class="one">
            <p>这是组件d</p>
        </div>`,
        mounted(){
            // console.log("D组件",this.a,this.b);
            console.log("D组件",this.A,this.B,this.C);
        }
    }

    var comC = {
        inject:["a","b"],
        data(){
            return {

            }
        },
        template:`<div class="one">
            <p>这是组件C</p>
            <com-d></com-d>
        </div>`,
        components:{
            comD:comD,
        },
        mounted(){
            console.log("组件C",this.a,this.b);
        }
    }

    var comB = {
        inject:["a","b"],
        data(){
            return {

            }
        },
        template:`<div class="one">
            <p>这是组件B---{{a}}---{{b}}</p>
            <com-c></com-c>
        </div>`,
        components:{
            comC:comC,
        },
        
    }

    var comA = {
        data(){
            return {

            }
        },
        template:`<div class="one">
                <p>这是组件A</p>
                <com-b></com-b>
        </div>`,
        components:{
            comB:comB,
        }
    }

    
    // provide / inject   => 一般情况下,需要一起使用
    // 允许一个祖先组件(父代组件)向其所有子孙后代(子代组件)注入一个依赖，不论组件层次有多深  => 子代组件可以使用父代组件的数据(前提:需要inject)

    // provide: 父组件向所有子孙后代(子代组件)注入一个依赖(对象)
    // provide 选项应该是一个对象或返回一个对象的函数。对象中的数据就是注入子代组件的数据

    // inject:  对应属性名,引入父组件注入的数据
    // inject 选项应该是一个字符串数组(),或者一个对象
    // 


    // 根实例/组件/应用
    var vm = new Vue({
        el:"#app",
        data:{

        },
        components:{ // 在当前组件(根组件) 注册了两个子组件 (comA comB)
            // 键名 => 组件名
            // 键值 => 组件的配置对象 
            comA:comA,
        },
        // provide的配置是一个对象 (此时对象中不能使用当前组件的数据,只能是一个死数据)
        provide:{
            a:1,
            b:2,
        }
    })



</script>
</html>